package com.example.myapplication3

import android.content.SharedPreferences
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import org.json.JSONArray
import org.json.JSONObject
import java.text.SimpleDateFormat
import java.util.*

// 主活动类，继承自 AppCompatActivity
class MainActivity : AppCompatActivity() {

    // 声明视图组件（延迟初始化）
    private lateinit var etInput: EditText  // 输入框
    private lateinit var btnRandom: Button  // 生成随机按钮
    private lateinit var tvResult: TextView // 结果显示
    private lateinit var rvHistory: RecyclerView // 历史记录列表
    private lateinit var btnClear: Button // 清空历史记录按钮

    // 历史记录相关变量
    private val historyList = mutableListOf<HistoryItem>() // 历史记录列表
    private lateinit var historyAdapter: HistoryAdapter // 历史记录适配器
    private lateinit var prefs: SharedPreferences // SharedPreferences 实例
    private val HISTORY_KEY = "history_data" // 历史记录的键名

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) // 设置布局文件

        // 初始化清空按钮及其点击事件
        btnClear = findViewById(R.id.btnClear)
        btnClear.setOnClickListener { clearHistory() }

        // 初始化 SharedPreferences，用于数据持久化
        prefs = getSharedPreferences("app_data", MODE_PRIVATE)

        initViews() // 初始化视图组件
        setupRecyclerView() // 设置 RecyclerView
        loadHistory() // 加载历史记录
    }

    // 清空历史记录的方法
    private fun clearHistory() {
        val recordCount = historyList.size // 获取记录数量

        if (recordCount > 0) {
            historyList.clear() // 清空列表
            historyAdapter.notifyDataSetChanged() // 通知适配器数据已更新
            saveHistory() // 保存清空后的历史记录
            Toast.makeText(this, "已清空 $recordCount 条记录", Toast.LENGTH_SHORT).show() // 显示提示
        } else {
            Toast.makeText(this, "当前没有可清空的记录", Toast.LENGTH_SHORT).show() // 显示提示
        }
    }

    // 初始化视图组件的方法
    private fun initViews() {
        etInput = findViewById(R.id.etInput) // 输入框
        btnRandom = findViewById(R.id.btnRandom) // 生成随机按钮
        tvResult = findViewById(R.id.tvResult) // 结果显示
        rvHistory = findViewById(R.id.rvHistory) // 历史记录列表

        // 设置按钮点击事件，调用生成随机文本的方法
        btnRandom.setOnClickListener { generateRandomText() }
    }

    // 设置 RecyclerView 的方法
    private fun setupRecyclerView() {
        // 初始化适配器，并设置项点击事件
        historyAdapter = HistoryAdapter(historyList) { selectedInput ->
            etInput.setText(selectedInput) // 将选中的历史输入设置到输入框
            etInput.setSelection(selectedInput.length) // 将光标移到输入框末尾
        }

        rvHistory.apply { // 使用 apply 函数配置 RecyclerView
            layoutManager = LinearLayoutManager(this@MainActivity) // 设置布局管理器
            adapter = historyAdapter // 设置适配器
            setHasFixedSize(true) // 设置固定大小优化性能
        }
    }

    // 加载历史记录的方法（从 SharedPreferences）
    private fun loadHistory() {
        try {
            // 从 SharedPreferences 获取保存的历史记录 JSON 字符串
            val jsonString = prefs.getString(HISTORY_KEY, null)
            jsonString?.let { // 如果字符串不为空，则解析
                val jsonArray = JSONArray(it) // 将字符串转换为 JSONArray
                historyList.clear() // 清空当前列表
                // 遍历 JSON 数组并添加到历史记录列表
                for (i in 0 until jsonArray.length()) {
                    val obj = jsonArray.getJSONObject(i)
                    historyList.add(
                        HistoryItem(
                            inputText = obj.getString("input"), // 获取输入文本
                            result = obj.getString("result"), // 获取结果
                            timestamp = obj.getString("time") // 获取时间戳
                        )
                    )
                }
                historyAdapter.notifyDataSetChanged() // 通知适配器数据已更新
            }
        } catch (e: Exception) { // 捕获异常并显示提示
            Toast.makeText(this, "加载历史记录失败", Toast.LENGTH_SHORT).show()
        }
    }

    // 保存历史记录的方法（到 SharedPreferences）
    private fun saveHistory() {
        try {
            // 创建 JSONArray 并添加所有历史记录项
            val jsonArray = JSONArray().apply {
                historyList.forEach { item ->
                    put(JSONObject().apply {
                        put("input", item.inputText) // 添加输入文本
                        put("result", item.result) // 添加结果
                        put("time", item.timestamp) // 添加时间戳
                    })
                }
            }
            // 将 JSONArray 转换为字符串并保存到 SharedPreferences
            prefs.edit().putString(HISTORY_KEY, jsonArray.toString()).apply()
        } catch (e: Exception) { // 捕获异常并显示提示
            Toast.makeText(this, "保存历史记录失败", Toast.LENGTH_SHORT).show()
        }
    }

    // 生成随机文本的方法
    private fun generateRandomText() {
        val inputText = etInput.text.toString().trim() // 获取并修剪输入文本
        // 将输入文本按连字符分割，过滤掉空字符串
        val items = inputText.split("-").map { it.trim() }.filter { it.isNotEmpty() }

        when {
            inputText.isEmpty() -> showToast("请输入内容") // 如果输入为空，显示提示
            items.size < 2 -> showToast("至少需要两个用'-'分隔的选项") // 如果选项不足，显示提示
            else -> {
                // 随机选择一个选项作为结果
                val randomIndex = (0 until items.size).random()
                val result = items[randomIndex]
                // 更新 UI 并保存历史记录
                updateUIAndSaveHistory(inputText, result)
            }
        }
    }

    // 更新 UI 并保存历史记录的方法
    private fun updateUIAndSaveHistory(inputText: String, result: String) {
        tvResult.text = result // 更新结果显示

        // 创建新的历史记录项并添加到列表开头
        historyList.add(0, HistoryItem(
            inputText = inputText,
            result = result,
            // 使用当前时间生成时间戳
            timestamp = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(Date())
        ))

        // 通知适配器在指定位置插入新项
        historyAdapter.notifyItemInserted(0)
        // 平滑滚动到列表顶部
        rvHistory.smoothScrollToPosition(0)
        // 保存更新后的历史记录
        saveHistory()
    }

    // 显示 Toast 提示的方法
    private fun showToast(message: String) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }

    // 历史记录项的数据类
    data class HistoryItem(
        val inputText: String, // 用户输入的文本
        val result: String, // 生成的结果
        val timestamp: String // 时间戳
    )

    // 历史记录适配器类
    private class HistoryAdapter(
        private val items: List<HistoryItem>, // 历史记录列表
        private val onItemClick: (String) -> Unit // 项点击回调
    ) : RecyclerView.Adapter<HistoryAdapter.ViewHolder>() {

        // 内部 ViewHolder 类，用于绑定视图
        inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
            val tvTime: TextView = view.findViewById(R.id.tvTime) // 时间戳
            val tvInput: TextView = view.findViewById(R.id.tvInput) // 输入文本
            val tvResult: TextView = view.findViewById(R.id.tvResult) // 结果
        }

        // 创建视图持有者的方法
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            // 使用 LayoutInflater 创建视图
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_history, parent, false)
            return ViewHolder(view) // 返回视图持有者
        }

        // 绑定视图持有者的方法
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val item = items[position] // 获取当前项
            with(holder) { // 使用 with 函数简化代码
                tvTime.text = item.timestamp // 设置时间戳
                tvInput.text = item.inputText // 设置输入文本
                tvResult.text = item.result // 设置结果
                // 设置项点击事件，调用回调
                itemView.setOnClickListener { onItemClick(item.inputText) }
            }
        }

        // 获取项数量的方法
        override fun getItemCount() = items.size
    }
}